在研究 k8s 的yaml 配置文件的时候,我总担心自己一不小心 会写错,所以我向往 使用将对象 序列化 yaml 的形式,
其实 python object 可以 直接 转 yaml ,甚至也可以 直接 转成yaml文件!!!
这里 会经常用到几个 函数 vars() ast.
import ast
dict_str='****'
real_dict=ast.literal_eval(dict_str)
## 可以处理 键没有 引号 或者键是单引号, json 转dict ,只能处理 键是双引号的
我们先尝试用最笨的方法 实现 object到yaml 的转化
在python对象 convert to dict 的形式,使用 vars()函数
然后 dict convert to json 使用 json.dumps(dict)函数
然后 json converte to yaml 使用 ya= yaml.load(json.dumps(dict)) 然后
再 yaml.safe_dump(ya,default_flow_style=False)
至此我们看到 从 python Object ---> dict ----> json ---> yaml 的转化
其中 obj dict json yaml 转 string ,只要 str()函数即可,或者 str(vars())结合
yaml 格式 写入到文件 ,需要注意的是, open()函数 的mode 一定要是 'w' ,不能是’wb', b代表是二进制写入
yaml 写入的是dict str,使用 ‘wb' 会报错,[yaml TypeError: a bytes-like object is required, not 'str']
【出现该错误往往是通过open()函数打开文本文件时,使用了‘rb’属性,如:fileHandle=open(filename,'rb'),则此时是通过二进制方式打开文件的,所以在后面处理时如果使用了str()函数,就会出现该错误,该错误不会再python2中出现。
具体解决方法有以下两种:
第一种,在open()函数中使用‘r’属性,即文本方式读取,而不是‘rb’,以二进制文件方式读取,可以直接解决问题。
第二种,在open()函数中使用‘rb’,可以在使用之前进行转换,有以下实例,来自:http://stackoverflow.com/questions/33054527/python-3-5-typeerror-a-bytes-like-object-is-required-not-str】
import yamlimport jsonobjdict=vars(Ojbect.instance)data=json.dumps(objdict)ya=yaml.load(data)filey='/Users/geo/Documents/etl_ml/etl_ml/data/demos.yaml'stream = open(filey, 'w')yaml.safe_dump(ya,stream,default_flow_style=False)
其实 python object 可以 直接 转 yaml ,甚至也可以 直接 转成yaml文件!!!
比如我已经定义了一个 Dog python class,他有 好几个属性 并已经赋值初始化了
import json
import yamlclass Dag:def __init__(self):self.apiVersion="apps/v1beta1"self.kind='Deployment'wifi_arr=['geo','tmtl','father']self.metadata=wifi_arrports_Arr=[{'containerPort':8080}]self.ports=ports_Arrdic={'app': {"containers": [{"name": "springboot-demo","image": "springboot-demo","imagePullPolicy": "IfNotPresent","ports": [{"containerPort": 8080}]}]}}#print(str(dic))self.di=dicmeta_Dict={'name':'springboot-demo-deployment','labels':dic}self.metadata=meta_Dict
另外生成 yaml 对象
if __name__ == '__main__':da=Dag()
###yaml_format=yaml.safe_dump(da.__dict__,default_flow_style=False)print( yaml_format)
生成yaml文件
if __name__ == '__main__':dog=Dag()file = 'data/demo.yaml'stream = open(file, 'w')
###重点!!! 生成 yaml 文件yaml.safe_dump(dog.__dict__, stream=stream,default_flow_style=False)
结果是
apiVersion: apps/v1beta1
di: &id001app:containers:- image: springboot-demoimagePullPolicy: IfNotPresentname: springboot-demoports:- containerPort: 8080
kind: Deployment
metadata:labels: *id001name: springboot-demo-deployment
ports:
- containerPort: 8080
反过来 yaml ----> json ---> 持久化 json 文件 indent=1属性是为了让 json 不以单行展示,而是展开
注意的是 python 的 dict 和set 很相似 ,都是 { }, set 里是list, dict 是键值对
【# set object is not JSON serializable [duplicate]
】
yaml_file = yaml.load(data)json_file='/data/demo.json'json_file2='/data/demo2.json'#json持久化 1with open(json_file,'w') as fp:fp.write(json.dumps(yaml_file,indent=1))# json持久化 2with open(json_file2, 'w') as fp:json.dump(yaml_file, fp,indent=1)
打开 demo.json
{"apiVersion": "apps/v1beta1","kind": "Deployment","metadata": {"name": "springboot-demo-deployment","labels": {"app": {"containers": [{"name": "springboot-demo","image": "springboot-demo","imagePullPolicy": "IfNotPresent","ports": [{"containerPort": 8080}]}]}}},"ports": [{"containerPort": 8080}],"di": {"app": {"containers": [{"name": "springboot-demo","image": "springboot-demo","imagePullPolicy": "IfNotPresent","ports": [{"containerPort": 8080}]}]}}
}
对象 转 json
import jsondef obj_to_json():stu = Student('007', '007', 28, 'male', '13000000000', '123@qq.com')print(type(stu)) #
Python之dict(或对象)与json之间的互相转化
在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作。
在Python中自带json库。通过import json导入。在json模块有2个方法,loads():将json数据转化成dict数据
dumps():将dict数据转化成json数据
load():读取json文件数据,转成dict数据
dump():将dict数据转化成json数据后写入json文件
下面是具体的示例:
dict字典转json数据
import jsondef dict_to_json():dict = {}dict['name'] = 'many'dict['age'] = 10dict['sex'] = 'male'print(dict) # 输出:{'name': 'many', 'age': 10, 'sex': 'male'}j = json.dumps(dict)print(j) # 输出:{"name": "many", "age": 10, "sex": "male"}if __name__ == '__main__':dict_to_json()
对象转json数据
import jsondef obj_to_json():stu = Student('007', '007', 28, 'male', '13000000000', '123@qq.com')print(type(stu)) #
json数据转成dict字典
import jsondef json_to_dict():j = '{"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}'dict = json.loads(s=j)print(dict) # {'id': '007', 'name': '007', 'age': 28, 'sex': 'male', 'phone': '13000000000', 'email': '123@qq.com'}if __name__ == '__main__':json_to_dict()
json数据转成对象
import jsondef json_to_obj():j = '{"id": "007", "name": "007", "age": 28, "sex": "male", "phone": "13000000000", "email": "123@qq.com"}'dict = json.loads(s=j)stu = Student()stu.__dict__ = dictprint('id: ' + stu.id + ' name: ' + stu.name + ' age: ' + str(stu.age) + ' sex: ' + str(stu.sex) + ' phone: ' + stu.phone + ' email: ' + stu.email) # id: 007 name: 007 age: 28 sex: male phone: 13000000000 email: 123@qq.comif __name__ == '__main__':json_to_obj()
json的load()与dump()方法的使用
dump()方法的使用
import jsondef dict_to_json_write_file():dict = {}dict['name'] = 'many'dict['age'] = 10dict['sex'] = 'male'print(dict) # {'name': 'many', 'age': 10, 'sex': 'male'}with open('1.json', 'w') as f:json.dump(dict, f) # 会在目录下生成一个1.json的文件,文件内容是dict数据转成的json数据if __name__ == '__main__':dict_to_json_write_file()load()的使用
import jsondef json_file_to_dict():with open('1.json', 'r') as f:dict = json.load(fp=f)print(dict) # {'name': 'many', 'age': 10, 'sex': 'male'}if __name__ == '__main__':json_file_to_dict()
0人点赞
spark mllib
作者:Helen_Cat
链接:https://www.jianshu.com/p/d28d33e52aaa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。